/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package op;

import core.QuebraString;
import java.util.Date;
import java.util.Map;
import java.util.StringTokenizer;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import op.CreateContaVivo3.TiposVivo3;

/**
 *
 * @author Jônatas
 */
public class QuebraStringVivo3 implements QuebraString {

    public static Pattern patternTelefone = Pattern.compile("[0-9]{2}-[0-9]{4}-[0-9]{4}");
    public static Pattern patternDuracao = Pattern.compile("[0-9]+m[0-9]{2}s");

    public static EntradaAbstrata quebraStringPlano(Map<String, Object> parametersMap) throws Exception {

        String plano = (String) parametersMap.get("plano");
        Telefone origem = (Telefone) parametersMap.get("origem");
        Double valor = (Double) parametersMap.get("valor");

        EntradaAbstrata entrada = new Ligacao();
        entrada.setCusto(valor);
        entrada.setNumeroDeOrigem(origem);
        entrada.setTipoDeLigacao(plano);
        entrada.setPlanoLigacao(plano);
        entrada.setDuracaoLigacaoSegundos(60);
        entrada.setDestino(new Telefone("", true));

        return entrada;
    }

    public EntradaAbstrata quebraString(Map<String, Object> parametersMap) throws Exception {

        // origem
        EntradaAbstrata entrada = new Ligacao();
        entrada.setNumeroDeOrigem((Telefone) parametersMap.get("origem"));

        String data = (String) parametersMap.get("data");
        String hora = (String) parametersMap.get("hora");
        String line = (String) parametersMap.get("line");
        String tipo = (String) parametersMap.get("tipo");
        Boolean aCobrar = (Boolean) parametersMap.get("aCobrar");

        TiposVivo3 tipoVivo3 = (TiposVivo3) parametersMap.get("TipoVivo3");

        if (tipoVivo3 == TiposVivo3.INTERNET) {

            Telefone destino = new Telefone("", true);

            entrada.setDestino(destino);

            entrada.setDuracaoLigacaoSegundos(60);

            StringTokenizer tokenizer = new StringTokenizer(line);

            tokenizer.nextToken();
            tokenizer.nextToken();

            tipo = "";

            String token = "";

            while (!token.matches("[0-9]+MB")) {
                tipo += token + " ";
                token = tokenizer.nextToken();
            }

            tipo = tipo.trim();


        } else {

            if (tipoVivo3 == TiposVivo3.CAIXA_POSTAL) {

                StringTokenizer tokenizer = new StringTokenizer(line);
                tokenizer.nextToken();
                tokenizer.nextToken();

                entrada.setDestino(new Telefone(tokenizer.nextToken(), true));

            } else {

                Matcher matchDestino = patternTelefone.matcher(line);
                if (!matchDestino.find()) {
                    return null;
                }
                // destino
                String fone = matchDestino.group();
                entrada.setDestino(new Telefone(fone.substring(0, 2), fone.substring(3, 7), fone.substring(8)));
            }
            if (tipoVivo3 == TiposVivo3.SMS || tipoVivo3 == TiposVivo3.ADICIONAL) {
                entrada.setDuracaoLigacaoSegundos(60);
            } else if (tipoVivo3 == TiposVivo3.LIGACAO || tipoVivo3 == TiposVivo3.CAIXA_POSTAL) {

                if (aCobrar) {
                    tipo += " - A Cobrar";
                }

                Matcher matchDuracao = patternDuracao.matcher(line);
                if (!matchDuracao.find()) {
                    return null;
                }
                String duracaoStr = matchDuracao.group();

                int mIdx = duracaoStr.indexOf('m');

                int minutos = Integer.parseInt(duracaoStr.substring(0, mIdx));

                int segundos = Integer.parseInt(duracaoStr.substring(mIdx + 1, duracaoStr.length() - 1));

                segundos += (minutos * 60);

                if (aCobrar) {
                    entrada.setDuracaoLigacaoACobrarSegundos(segundos);
                } else {
                    entrada.setDuracaoLigacaoSegundos(segundos);
                }

            }
        }

        // data
        Date dataLig = QuebraStringVivo2.createDate(data, hora);
        entrada.setDataOrigemLigacao(dataLig);

        double valor = getValor(line);

        if (valor == 0.0) {
            tipo += " - Franqueada";
        }

        // custo
        entrada.setCusto(valor);

        // plano e tipo
        entrada.setPlanoLigacao(tipo);
        entrada.setTipoDeLigacao(tipo);

        return entrada;
    }
    public static Pattern patternValor = Pattern.compile("[0-9]+[,][0-9]{2}");

    private double getValor(String line) {
        Matcher matchValor = patternValor.matcher(line);
        matchValor.find();
        double retorno = 0;
        retorno = Double.parseDouble(matchValor.group().replace(",", "."));

        return retorno;
    }
}
